package com.nuc.zyt.day02.Proxy.DynamicProxy;

/**
 * @ClassName DynamicProxy
 * @Description TODO
 * @Author 耀酱
 * @Date 2023/5/15 11:13
 * @Version 1.0
 */

import com.nuc.zyt.day02.Proxy.Eat;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 其实我的意思是，能否让JVM根据接口自动生成代理对象呢？
 * 比如，有没有一个方法，我传入接口+增强的代码（比如打印日志），
 * 它就给我自动返回代理对象呢？这样就能省去编写代理类这个无用的“中介”了，没有中间商赚差价，岂不爽哉？
 */
public class DynamicProxy{


    public static Object getProxy(final Object target ,final InvocationHandler handler) throws Exception {
        // 参数1：随便找个类加载器给它 参数2：需要代理的接口
        Class<?> proxyClazz = Proxy.getProxyClass(target.getClass().getClassLoader(), target.getClass().getInterfaces());
        Constructor<?> constructor = proxyClazz.getConstructor(InvocationHandler.class);
        return constructor.newInstance(handler);
    }

    /**
     * 增强代码 可自定义
     * @param target
     * @return
     */
    public static InvocationHandler getHandle(final Object target){
        return new InvocationHandler() {
            @Override
            public Object invoke(Object proxy1, Method method, Object[] args) throws Throwable {
                System.out.println(method.getName() + "方法开始执行...");
                Object result = method.invoke(target, args);
                System.out.println(method.getName() + "方法执行结束...");
                return result;
            }
        };


    }


}
